package cn.tedu.tickets;

public class TestThreadV2 {
    public static void main(String[] args) {
        TicketThreadV2 t1 = new TicketThreadV2();
        TicketThreadV2 t2 = new TicketThreadV2();
        TicketThreadV2 t3 = new TicketThreadV2();
        TicketThreadV2 t4 = new TicketThreadV2();
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
class TicketThreadV2 extends Thread{
    /*问题:4个线程对象共计售票400张,原因是创建了4个不同的线程对象
     * 每个对象都把票数tickets看作自己独有的成员变量,互不影响
     * 解决:将票数设置为静态,让全局所有对象共享*/
    static int tickets = 100;
    static Object o=new Object();
    @Override
    public void run() {
        while (true){
            //synchronized (o){//可以
            /*我们每通过class关键字创建一个类,就会在工作空间中生成唯一对象的类名.class字节码文件
            * 这个类名.class对应的对象,我们称之为这个类的字节码对象
            * 字节码对象极其重要,是反射技术的基石,字节码对象包含了当前类所有的关键信息
            * 所以,用这样一个唯一且明确的对象作为同步代码块的锁对象,再合适不过了*/
            synchronized (TicketThreadV2.class){
                if (tickets>0){
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //打印当前正在售票的线程名,并且每次卖票 票数-1
                    System.out.println(getName()+"="+tickets--);
                }
                //如果没有票了,结束循环 如果if后大括号里只有一句话,大括号可以省略
                if(tickets <= 0)break;//注意,死循环一定要设置出口
            }
        }
    }
}

